package com.ingenio.dao;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ingenio.Adapter;
import com.ingenio.business.Permiso;
import com.ingenio.business.Rol;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

public class PermisoAdapter extends Adapter{
	
	public void agregarPermiso(Permiso permiso) throws Exception{
		Connection conn = null;
		PreparedStatement stmt = null;
		try {
	    	conn = (Connection) abrirConexion();
	    	String add ="INSERT into permisos (descPermiso, perHabilitado) " +
					"VALUES (?, 1)";
			stmt = (PreparedStatement) conn.prepareStatement(add);
			stmt.setString(1, permiso.getDescPermiso());
			stmt.execute();
		}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
	}
	
	public void eliminarPermiso(Permiso permiso) throws Exception{
    	Connection conn = null;
    	PreparedStatement stmt = null;
    	try {
	    	conn = (Connection) abrirConexion();
	    	String del ="UPDATE permisos SET perHabilitado = 0 WHERE IdPermiso = ?";
			stmt = (PreparedStatement) conn.prepareStatement(del);
			stmt.setInt(1, permiso.getIdPermiso());
			stmt.execute();
		}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
    }
	
	public void modificarDescripcion(Permiso permiso) throws Exception{
    	Connection conn = null;
    	PreparedStatement stmt = null;
    	try {
	    	conn = (Connection) abrirConexion();
	    	String upd ="UPDATE permisos SET descPermiso = ? WHERE IdPermiso = ?";
	    	stmt = (PreparedStatement) conn.prepareStatement(upd);
	    	stmt.setString(1, permiso.getDescPermiso());
	    	stmt.setInt(2, permiso.getIdPermiso());
	    	stmt.executeUpdate();
		}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
    }
	
	public Permiso devolverPermiso(Integer id) throws Exception{
    	Connection conn = null;
    	Permiso p = null;
    	PreparedStatement stmt = null;
    	try {
    		conn = (Connection) abrirConexion();
    		String sel ="SELECT descPermiso as descripcion FROM permisos WHERE IdPermiso = ? and perHabilitado = 1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setInt(1, id);
    		ResultSet result = stmt.executeQuery();
    		
    		if(result.next()){
    			String descripcion = result.getString("descripcion");
    			p = new Permiso(id, descripcion, true);
    		}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
		return p;
    }
	
	public List<Permiso> devolverTodos() throws Exception{
    	Connection conn = null;
    	List<Permiso> permisos = new ArrayList<Permiso>();
    	PreparedStatement stmt = null;
		try {
			conn = (Connection) abrirConexion();
    		Permiso p = null;
    	
    		String sel ="SELECT IdPermiso , descPermiso as descripcion from permisos WHERE perHabilitado = 1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		ResultSet result = stmt.executeQuery();
    		while(result.next()){
    			Integer id = result.getInt("IdPermiso");
    			String descripcion = result.getString("descripcion");
    			p = new Permiso(id, descripcion, true);
    			permisos.add(p);
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
    	return permisos;
    }
	
	public List<Permiso> devolverPermisosRol(Rol rol) throws Exception{
    	Connection conn = null;
    	List<Permiso> permisos = new ArrayList<Permiso>();
    	PermisoAdapter pa = new PermisoAdapter();
    	PreparedStatement stmt = null;
		try {
			conn = (Connection) abrirConexion();
    		Permiso p = null;
    	
    		String sel ="SELECT * from rolespermisos WHERE IdRol = ?";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setInt(1, rol.getIdRol());
    		ResultSet result = stmt.executeQuery();
    		while(result.next()){
    			Integer idPermiso = result.getInt("IdPermiso");
    			p = pa.devolverPermiso(idPermiso);
    			if (p.isPerHabilitado()){
    				permisos.add(p);
    			}
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
    	return permisos;
    }
	
}
